package failover

import (
	"context"
	"errors"
	"fmt"
	"sync/atomic"
	"webook/internal/service/sms"
)

// FailOverSmsServiceV2 拥有失败处理的短信发送装饰器第二种实现
type FailOverSmsServiceV2 struct {
	svcs     []sms.Service
	startIdx uint64 // 轮询的起始下标
}

func NewFailOverSmsServiceV2(svcs []sms.Service) *FailOverSmsServiceV2 {
	return &FailOverSmsServiceV2{
		svcs:     svcs,
		startIdx: -1,
	}
}

func (f *FailOverSmsServiceV2) Send(ctx context.Context, phone string, templateCode string, templateParam string) error {
	// 轮询实现
	idx := atomic.AddUint64(&f.startIdx, 1)
	for i := idx; i < idx+uint64(len(f.svcs)); i++ {
		i = i % uint64(len(f.svcs))
		err := f.svcs[i].Send(ctx, phone, templateCode, templateParam)
		if err != nil {
			// TODO：日志、监控
			fmt.Errorf("短信服务商出错: %w", err)
			// 切换下一个短信服务商
			continue
		}
		return nil
	}
	// 说明全部服务商出错
	// TODO：日志、监控
	return errors.New("发送失败，全部服务商都尝试过了")
}
